package co.yixiang.message.redis.config;

import co.yixiang.modules.shop.domain.YxSystemConfig;
import co.yixiang.modules.shop.service.YxSystemConfigService;
import co.yixiang.utils.RedisUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * api服务启动初始化redis
 * 该类的作用是在应用启动时，将系统配置相关的键值对加载到Redis中，以便快速访问
 */
@Slf4j
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class RedisKeyInitialization  implements CommandLineRunner {

    // 系统配置服务，用于获取系统配置信息
    private final YxSystemConfigService systemConfigService;

    // Redis工具类，用于操作Redis
    private final RedisUtils redisUtils;

    /**
     * 初始化redis
     * 该方法从系统配置中获取所有配置项，并将它们存储到Redis中
     * 这样做是为了在应用运行时快速访问这些配置信息，避免每次请求都去数据库查询
     */
    private void redisKeyInitialization(){
        try {
            // 获取所有系统配置
            List<YxSystemConfig> systemConfigs = systemConfigService.list();
            // 遍历每个系统配置，将其存储到Redis中
            for (YxSystemConfig systemConfig : systemConfigs) {
                redisUtils.set(systemConfig.getMenuName(),systemConfig.getValue());
            }
            // 日志记录redisKey初始化成功
            log.info("---------------redisKey初始化成功---------------");
        }catch (Exception e){
            // 日志记录redisKey初始化失败
            log.error("redisKey初始化失败: {}",e.getMessage());
        }
    }

    /**
     * 实现CommandLineRunner接口的run方法
     * 该方法在应用启动后执行，调用redisKeyInitialization方法初始化Redis
     * @param args 命令行参数
     * @throws Exception 可能抛出的异常
     */
    @Override
    public void run(String... args) throws Exception {
        this.redisKeyInitialization();
    }
}
